'''


可迭代对象（Iterable）
定义: 可迭代对象是指任何实现了__iter__()方法的对象，或者实现了__getitem__()方法的对象。
功能: 它们可以返回一个迭代器，通常用于for循环中。
常见类型: 列表（list）、元组（tuple）、字典（dict）、集合（set）、字符串（str）等都是可迭代对象。

迭代器对象（Iterator）
定义: 迭代器是一个实现了__iter__()和__next__()方法的对象。
__iter__()：返回迭代器自身。
__next__()：返回容器中的下一个项目，并在没有更多项目时引发StopIteration异常。
功能: 迭代器用于逐个访问集合中的元素，而不需一次性将所有元素加载到内存中。

关键点：
1. `__iter__()` 方法：可迭代对象必须实现 `__iter__()` 方法，该方法返回一个迭代器对象。
2. `__next__()` 方法：迭代器必须实现 `__next__()` 方法，
用于返回下一个元素。如果没有更多元素，则抛出 `StopIteration` 异常。
3. 常见可迭代对象：列表、元组、字符串、字典、集合等都是可迭代对象。
4. `for` 循环：`for` 循环的本质就是循环一个可迭代对象，
它会自动调用 `__iter__()` 方法获取迭代器，并通过 `__next__()` 方法逐个访问元素。

自定义迭代器：
可以通过定义一个类并实现__iter__()和__next__()方法来自定义迭代器。

'''
from collections.abc import Iterator


# 自定义的一个迭代器
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if self.a <= 5:  # 限制迭代次数
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration  # 停止迭代

my_class = MyNumbers()
my_iter = iter(my_class)


for i in my_class:
    print(i)

for number in my_iter:
    print(number)

# 检查是否为迭代器
print(isinstance(my_iter, Iterator))


